package Logica;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import models.Login;
import models.dao.DAOLogin;


public class Sistema {
	private List<Sala> salas = new ArrayList<>();
	private Map<String, Jogador> jogadores = new HashMap<>();
	
	public synchronized void criarSala(String nome, String nomeDodono){
		List<Sala> copia = new ArrayList<>(salas);
		
		for (Sala s : copia) {
			if (s.getNome().equalsIgnoreCase(nome))
				throw new IllegalArgumentException("O nome da sala já existe!");
			
			else if (s.getNomeDoDono().equalsIgnoreCase(nomeDodono) && s.getStatus() == true)
					throw new IllegalArgumentException("O jogador já tem uma sala criada!");
		}
		
		Jogador jogador = jogadores.get(nomeDodono);
		Sala sala = new Sala(nome, jogador);
		jogador.setSalaAtual(sala);
		salas.add(sala);
	}
	
	public List<Sala> visualizarSala(){
		
		List<Sala> salaativas = new ArrayList<>();
		
		for (Sala s : salas){
			
			if (s.getStatus() == true){
				salaativas.add(s); 
			}	
		}
		
		return salaativas;
	}
	
	public synchronized void entrarSala(Jogador jogador, Sala sala){
		
		if(sala.getStatus() == false){
			throw new IllegalArgumentException("Vocé não pode entrar em uma sala inativa!");
		}
		else if(sala.getNomeDoDono().equalsIgnoreCase(jogador.getNome())){
			throw new IllegalArgumentException("Esse jogador é o dono da sala!");
		}
		else if (sala.getJogadores().size() < 8 ){
			sala.getJogadores().add(jogador);
			jogador.setSalaAtual(sala);
		} else {
			throw new IllegalArgumentException("A sala está cheia!");
		}	
		
	}
	
	public synchronized void sairSala(Jogador jogador, Sala sala){
		
		if(sala.getNomeDoDono().equalsIgnoreCase(jogador.getNome())){
			sala.getJogadores().remove(jogador);
			if(!sala.getJogadores().isEmpty())
				sala.setDono(sala.getJogadores().get(0));
			if (sala.getJogadores().isEmpty()){
				sala.setStatus(false);
				salas.remove(sala);
			}
		} else {
			sala.getJogadores().remove(jogador);
			jogador.setstatusPartida(false);
		}
				if(sala.getJogadores().size() == 1){
					sala.getDono().setstatusPartida(false);	
				}
			
	}
	
	public synchronized void setJogadorPronto(Jogador jogador, Sala sala){
		
		for(Jogador j : sala.getJogadores()){
			if(j.equals(jogador)){
				sala.getJogadorByName(jogador.getNome()).setstatusPartida(true);
				for(Jogador l : sala.getJogadores()){
					if(!l.equals(sala.getDono()) && l.getstatusPartida() == false){
						return;
					}
				}
				sala.getDono().setstatusPartida(true);
			}
		}	
	} 
	
	public synchronized void setJogadorCancelar(Jogador jogador, Sala sala){

		for(Jogador j : sala.getJogadores()){
			if(j.equals(jogador)){
				sala.getJogadorByName(jogador.getNome()).setstatusPartida(false);
				sala.getDono().setstatusPartida(false);	
			}
		}	
	} 
	
	public void iniciarPartida(Jogador jogador, Sala sala){
		sala.iniciarPartida(jogador);
	}
	
	public synchronized void entrar(String nomeJogador){
		Jogador jogador = new Jogador();
		jogador.setNome(nomeJogador);
		jogadores.put(nomeJogador, jogador);
	}
	
	public synchronized void sair(String nomeJogador){
		jogadores.remove(nomeJogador);
	}
	
	public Partida Partida(Sala sala){
		return sala.getPartida();
	}
	
	public Sala sala(String nome){
		Sala sala = null;
		for (Sala s : salas){
			if (s.getNome().equalsIgnoreCase(nome)){
				sala = s; 
			}
		}
		return sala;	
	}
	
	public boolean ContemJogador(String nomeJogador){
		if(jogadores.containsKey(nomeJogador)){
			return true;
		} else{
			return false;
		}
	}
	
	public boolean LoginBD(String nomeJogador, String senha){
		DAOLogin daoLogin = new DAOLogin();
		Login login = new Login(nomeJogador, senha);
		
		
		try{ 
            if (daoLogin.autenticar(login)) {
                    return true;
            } 
        }catch(Exception ex){
        	return false;
        }
	return false;
	}
	
	public void GravarDadosBD(Sala s, Partida p){
		/*DAOLogica daologica = new DAOLogica();
		
		if(daologica.buscapartida(s.getId()).isEmpty()){
			daologica.Sala(s);
			daologica.Partida(p, s);
		} else {
			daologica.Partida(p, s);
		}*/
	}
	
	public Jogador jogador(String nome){
	
		return jogadores.get(nome);
	}

	public int getQuantidadeSalas() {
		return salas.size();
	}
	
}